🎖️GitЯра🎖️
Node / meshtastic / Meshtastic-Android / files / app / src / main / java / com / geeksville / mesh / ui / contact / Contacts.kt
Displaying Raw • Download
app/src/main/java/com/geeksville/mesh/ui/contact/Contacts.kt 78274c792318331b11ab64cd28e58e829875b8c2 (78274c79) Text, 25.75 KB
T8b949e/*
* Copyright (c) 2025 Meshtastic LLC
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
Tff7b72package T7ee787com.geeksville.mesh.ui.contact
Tff7b72import T7ee787androidx.compose.foundation.layout.Box
Tff7b72import T7ee787androidx.compose.foundation.layout.Column
Tff7b72import T7ee787androidx.compose.foundation.layout.Row
Tff7b72import T7ee787androidx.compose.foundation.layout.fillMaxSize
Tff7b72import T7ee787androidx.compose.foundation.layout.fillMaxWidth
Tff7b72import T7ee787androidx.compose.foundation.layout.padding
Tff7b72import T7ee787androidx.compose.foundation.lazy.LazyColumn
Tff7b72import T7ee787androidx.compose.foundation.lazy.LazyListScope
Tff7b72import T7ee787androidx.compose.foundation.lazy.LazyListState
Tff7b72import T7ee787androidx.compose.foundation.lazy.rememberLazyListState
Tff7b72import T7ee787androidx.compose.foundation.selection.selectable
Tff7b72import T7ee787androidx.compose.material.icons.Icons
Tff7b72import T7ee787androidx.compose.material.icons.automirrored.twotone.VolumeMute
Tff7b72import T7ee787androidx.compose.material.icons.automirrored.twotone.VolumeUp
Tff7b72import T7ee787androidx.compose.material.icons.filled.Close
Tff7b72import T7ee787androidx.compose.material.icons.filled.Delete
Tff7b72import T7ee787androidx.compose.material.icons.filled.SelectAll
Tff7b72import T7ee787androidx.compose.material.icons.rounded.QrCode2
Tff7b72import T7ee787androidx.compose.material3.AlertDialog
Tff7b72import T7ee787androidx.compose.material3.Button
Tff7b72import T7ee787androidx.compose.material3.CircularProgressIndicator
Tff7b72import T7ee787androidx.compose.material3.ExperimentalMaterial3Api
Tff7b72import T7ee787androidx.compose.material3.ExperimentalMaterial3ExpressiveApi
Tff7b72import T7ee787androidx.compose.material3.FloatingActionButton
Tff7b72import T7ee787androidx.compose.material3.Icon
Tff7b72import T7ee787androidx.compose.material3.IconButton
Tff7b72import T7ee787androidx.compose.material3.RadioButton
Tff7b72import T7ee787androidx.compose.material3.Scaffold
Tff7b72import T7ee787androidx.compose.material3.Text
Tff7b72import T7ee787androidx.compose.material3.TopAppBar
Tff7b72import T7ee787androidx.compose.material3.animateFloatingActionButton
Tff7b72import T7ee787androidx.compose.runtime.Composable
Tff7b72import T7ee787androidx.compose.runtime.LaunchedEffect
Tff7b72import T7ee787androidx.compose.runtime.derivedStateOf
Tff7b72import T7ee787androidx.compose.runtime.getValue
Tff7b72import T7ee787androidx.compose.runtime.mutableStateListOf
Tff7b72import T7ee787androidx.compose.runtime.mutableStateOf
Tff7b72import T7ee787androidx.compose.runtime.remember
Tff7b72import T7ee787androidx.compose.runtime.rememberCoroutineScope
Tff7b72import T7ee787androidx.compose.runtime.setValue
Tff7b72import T7ee787androidx.compose.ui.Alignment
Tff7b72import T7ee787androidx.compose.ui.Modifier
Tff7b72import T7ee787androidx.compose.ui.hapticfeedback.HapticFeedback
Tff7b72import T7ee787androidx.compose.ui.hapticfeedback.HapticFeedbackType
Tff7b72import T7ee787androidx.compose.ui.platform.LocalHapticFeedback
Tff7b72import T7ee787androidx.compose.ui.unit.dp
Tff7b72import T7ee787androidx.compose.ui.window.DialogProperties
Tff7b72import T7ee787androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel
Tff7b72import T7ee787androidx.lifecycle.compose.collectAsStateWithLifecycle
Tff7b72import T7ee787androidx.paging.LoadState
Tff7b72import T7ee787androidx.paging.compose.LazyPagingItems
Tff7b72import T7ee787androidx.paging.compose.collectAsLazyPagingItems
Tff7b72import T7ee787com.geeksville.mesh.model.Contact
Tff7b72import T7ee787kotlinx.coroutines.flow.Flow
Tff7b72import T7ee787kotlinx.coroutines.flow.collectLatest
Tff7b72import T7ee787org.jetbrains.compose.resources.pluralStringResource
Tff7b72import T7ee787org.jetbrains.compose.resources.stringResource
Tff7b72import T7ee787org.meshtastic.core.database.entity.ContactSettings
Tff7b72import T7ee787org.meshtastic.core.model.util.formatMuteRemainingTime
Tff7b72import T7ee787org.meshtastic.core.model.util.getChannel
Tff7b72import T7ee787org.meshtastic.core.strings.Res
Tff7b72import T7ee787org.meshtastic.core.strings.cancel
Tff7b72import T7ee787org.meshtastic.core.strings.close_selection
Tff7b72import T7ee787org.meshtastic.core.strings.conversations
Tff7b72import T7ee787org.meshtastic.core.strings.currently
Tff7b72import T7ee787org.meshtastic.core.strings.delete
Tff7b72import T7ee787org.meshtastic.core.strings.delete_messages
Tff7b72import T7ee787org.meshtastic.core.strings.delete_selection
Tff7b72import T7ee787org.meshtastic.core.strings.mute_1_week
Tff7b72import T7ee787org.meshtastic.core.strings.mute_8_hours
Tff7b72import T7ee787org.meshtastic.core.strings.mute_always
Tff7b72import T7ee787org.meshtastic.core.strings.mute_notifications
Tff7b72import T7ee787org.meshtastic.core.strings.mute_status_always
Tff7b72import T7ee787org.meshtastic.core.strings.mute_status_muted_for_days
Tff7b72import T7ee787org.meshtastic.core.strings.mute_status_muted_for_hours
Tff7b72import T7ee787org.meshtastic.core.strings.mute_status_unmuted
Tff7b72import T7ee787org.meshtastic.core.strings.okay
Tff7b72import T7ee787org.meshtastic.core.strings.select_all
Tff7b72import T7ee787org.meshtastic.core.strings.unmute
Tff7b72import T7ee787org.meshtastic.core.ui.component.MainAppBar
Tff7b72import T7ee787org.meshtastic.core.ui.component.ScrollToTopEvent
Tff7b72import T7ee787org.meshtastic.core.ui.component.smartScrollToTop
Tff7b72import T7ee787org.meshtastic.proto.AppOnlyProtos
Tff7b72import T7ee787java.util.concurrent.TimeUnit
Tf0883e@OptInTb4b4b4(Te6edf3ExperimentalMaterial3ExpressiveApiTff7b72::Te6edf3classTb4b4b4)
Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffLongMethodTa5d6ff"Tb4b4b4)
Tf0883e@Composable
Tff7b72fun Td2a8ffContactsScreenTb4b4b4(
Te6edf3onNavigateToShareTb4b4b4: Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4,
Te6edf3viewModelTb4b4b4: Te6edf3ContactsViewModel Tff7b72= Te6edf3hiltViewModelTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3onClickNodeChipTb4b4b4: Tb4b4b4(Tffa657IntTb4b4b4) Tff7b72-Tff7b72> Tffa657Unit Tff7b72= Tb4b4b4{Tb4b4b4}Tb4b4b4,
Te6edf3onNavigateToMessagesTb4b4b4: Tb4b4b4(Tffa657StringTb4b4b4) Tff7b72-Tff7b72> Tffa657Unit Tff7b72= Tb4b4b4{Tb4b4b4}Tb4b4b4,
Te6edf3onNavigateToNodeDetailsTb4b4b4: Tb4b4b4(Tffa657IntTb4b4b4) Tff7b72-Tff7b72> Tffa657Unit Tff7b72= Tb4b4b4{Tb4b4b4}Tb4b4b4,
Te6edf3scrollToTopEventsTb4b4b4: Te6edf3FlowTff7b72<Te6edf3ScrollToTopEventTff7b72>Tff7b72? Tff7b72= Tff7b72nullTb4b4b4,
Te6edf3activeContactKeyTb4b4b4: Tffa657String? Tff7b72= Tff7b72nullTb4b4b4,
Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3connectionState Tff7b72by Te6edf3viewModelTb4b4b4.Te6edf3connectionStateTb4b4b4.Te6edf3collectAsStateWithLifecycleTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3ourNode Tff7b72by Te6edf3viewModelTb4b4b4.Te6edf3ourNodeInfoTb4b4b4.Te6edf3collectAsStateWithLifecycleTb4b4b4(Tb4b4b4)
Tff7b72var Te6edf3showMuteDialog Tff7b72by Te6edf3remember Tb4b4b4{ Te6edf3mutableStateOfTb4b4b4(Tff7b72falseTb4b4b4) Tb4b4b4}
Tff7b72var Te6edf3showDeleteDialog Tff7b72by Te6edf3remember Tb4b4b4{ Te6edf3mutableStateOfTb4b4b4(Tff7b72falseTb4b4b4) Tb4b4b4}
T8b949e// State for managing selected contacts
Tff7b72val Te6edf3selectedContactKeys Tff7b72= Te6edf3remember Tb4b4b4{ Te6edf3mutableStateListOfTff7b72<Tffa657StringTff7b72>Tb4b4b4(Tb4b4b4) Tb4b4b4}
Tff7b72val Te6edf3isSelectionModeActive Tff7b72by Te6edf3remember Tb4b4b4{ Te6edf3derivedStateOf Tb4b4b4{ Te6edf3selectedContactKeysTb4b4b4.Te6edf3isNotEmptyTb4b4b4(Tb4b4b4) Tb4b4b4} Tb4b4b4}
T8b949e// State for contacts list
Tff7b72val Te6edf3pagedContacts Tff7b72= Te6edf3viewModelTb4b4b4.Te6edf3contactListPagedTb4b4b4.Te6edf3collectAsLazyPagingItemsTb4b4b4(Tb4b4b4)
T8b949e// Create channel placeholders (always show broadcast contacts, even when empty)
Tff7b72val Te6edf3channels Tff7b72by Te6edf3viewModelTb4b4b4.Te6edf3channelsTb4b4b4.Te6edf3collectAsStateWithLifecycleTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3channelPlaceholders Tff7b72=
Te6edf3rememberTb4b4b4(Te6edf3channelsTb4b4b4.Te6edf3settingsListTb4b4b4.Te6edf3sizeTb4b4b4) Tb4b4b4{
Tb4b4b4(T79c0ff0 Te6edf3until Te6edf3channelsTb4b4b4.Te6edf3settingsListTb4b4b4.Te6edf3sizeTb4b4b4)Tb4b4b4.Te6edf3map Tb4b4b4{ Te6edf3ch Tff7b72-Tff7b72>
Te6edf3ContactTb4b4b4(
Te6edf3contactKey Tff7b72= Ta5d6ff"Tffd700$Te6edf3chTa5d6ff^allTa5d6ff"Tb4b4b4,
Te6edf3shortName Tff7b72= Ta5d6ff"Tffd700$Te6edf3chTa5d6ff"Tb4b4b4,
Te6edf3longName Tff7b72= Te6edf3channelsTb4b4b4.Te6edf3getChannelTb4b4b4(Te6edf3chTb4b4b4)Tff7b72?.Te6edf3name Tff7b72?: Ta5d6ff"Ta5d6ffChannel Tffd700$Te6edf3chTa5d6ff"Tb4b4b4,
Te6edf3lastMessageTime Tff7b72= Ta5d6ff"Ta5d6ff"Tb4b4b4,
Te6edf3lastMessageText Tff7b72= Ta5d6ff"Ta5d6ff"Tb4b4b4,
Te6edf3unreadCount Tff7b72= T79c0ff0Tb4b4b4,
Te6edf3messageCount Tff7b72= T79c0ff0Tb4b4b4,
Te6edf3isMuted Tff7b72= Tff7b72falseTb4b4b4,
Te6edf3isUnmessageable Tff7b72= Tff7b72falseTb4b4b4,
Te6edf3nodeColors Tff7b72= Tff7b72nullTb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tff7b72val Te6edf3contactsListState Tff7b72= Te6edf3rememberLazyListStateTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3coroutineScope Tff7b72= Te6edf3rememberCoroutineScopeTb4b4b4(Tb4b4b4)
Te6edf3LaunchedEffectTb4b4b4(Te6edf3scrollToTopEventsTb4b4b4) Tb4b4b4{
Te6edf3scrollToTopEventsTff7b72?.Te6edf3collectLatest Tb4b4b4{ Te6edf3event Tff7b72-Tff7b72>
Tff7b72if Tb4b4b4(Te6edf3event Tff7b72is Te6edf3ScrollToTopEventTb4b4b4.Te6edf3ConversationsTabPressedTb4b4b4) Tb4b4b4{
Te6edf3contactsListStateTb4b4b4.Te6edf3smartScrollToTopTb4b4b4(Te6edf3coroutineScopeTb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
T8b949e// Derived state for selected contacts and count
Tff7b72val Te6edf3selectedContacts Tff7b72=
Te6edf3rememberTb4b4b4(Te6edf3pagedContactsTb4b4b4.Te6edf3itemCountTb4b4b4, Te6edf3selectedContactKeysTb4b4b4) Tb4b4b4{
Tb4b4b4(T79c0ff0 Te6edf3until Te6edf3pagedContactsTb4b4b4.Te6edf3itemCountTb4b4b4)
Tb4b4b4.Te6edf3mapNotNull Tb4b4b4{ Te6edf3pagedContactsTff7b72[Tffa657itTff7b72] Tb4b4b4}
Tb4b4b4.Te6edf3filter Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3contactKey Tff7b72in Te6edf3selectedContactKeys Tb4b4b4}
Tb4b4b4}
Tff7b72val Te6edf3selectedCount Tff7b72= Te6edf3rememberTb4b4b4(Te6edf3selectedContactsTb4b4b4) Tb4b4b4{ Te6edf3selectedContactsTb4b4b4.Te6edf3sumOf Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3messageCount Tb4b4b4} Tb4b4b4}
Tff7b72val Te6edf3isAllMuted Tff7b72= Te6edf3rememberTb4b4b4(Te6edf3selectedContactsTb4b4b4) Tb4b4b4{ Te6edf3selectedContactsTb4b4b4.Te6edf3all Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3isMuted Tb4b4b4} Tb4b4b4}
T8b949e// Callback functions for item interaction
Tff7b72val Te6edf3onContactClickTb4b4b4: Tb4b4b4(Te6edf3ContactTb4b4b4) Tff7b72-Tff7b72> Tffa657Unit Tff7b72= Tb4b4b4{ Te6edf3contact Tff7b72-Tff7b72>
Tff7b72if Tb4b4b4(Te6edf3isSelectionModeActiveTb4b4b4) Tb4b4b4{
T8b949e// If in selection mode, toggle selection
Tff7b72if Tb4b4b4(Te6edf3selectedContactKeysTb4b4b4.Te6edf3containsTb4b4b4(Te6edf3contactTb4b4b4.Te6edf3contactKeyTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3selectedContactKeysTb4b4b4.Te6edf3removeTb4b4b4(Te6edf3contactTb4b4b4.Te6edf3contactKeyTb4b4b4)
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3selectedContactKeysTb4b4b4.Te6edf3addTb4b4b4(Te6edf3contactTb4b4b4.Te6edf3contactKeyTb4b4b4)
Tb4b4b4}
Tb4b4b4} Tff7b72else Tb4b4b4{
T8b949e// If not in selection mode, navigate to messages
Te6edf3onNavigateToMessagesTb4b4b4(Te6edf3contactTb4b4b4.Te6edf3contactKeyTb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tff7b72val Te6edf3onNodeChipClickTb4b4b4: Tb4b4b4(Te6edf3ContactTb4b4b4) Tff7b72-Tff7b72> Tffa657Unit Tff7b72= Tb4b4b4{ Te6edf3contact Tff7b72-Tff7b72>
Tff7b72if Tb4b4b4(Te6edf3contactTb4b4b4.Te6edf3contactKeyTb4b4b4.Te6edf3containsTb4b4b4(Ta5d6ff"Ta5d6ff!Ta5d6ff"Tb4b4b4)Tb4b4b4) Tb4b4b4{
T8b949e// if it's a node, look up the nodeNum including the !
Tff7b72val Te6edf3nodeKey Tff7b72= Te6edf3contactTb4b4b4.Te6edf3contactKeyTb4b4b4.Te6edf3substringTb4b4b4(T79c0ff1Tb4b4b4)
Tff7b72val Te6edf3node Tff7b72= Te6edf3viewModelTb4b4b4.Te6edf3getNodeTb4b4b4(Te6edf3nodeKeyTb4b4b4)
Te6edf3onNavigateToNodeDetailsTb4b4b4(Te6edf3nodeTb4b4b4.Te6edf3numTb4b4b4)
Tb4b4b4} Tff7b72else Tb4b4b4{
T8b949e// Channels
Tb4b4b4}
Tb4b4b4}
Tff7b72val Te6edf3onContactLongClickTb4b4b4: Tb4b4b4(Te6edf3ContactTb4b4b4) Tff7b72-Tff7b72> Tffa657Unit Tff7b72= Tb4b4b4{ Te6edf3contact Tff7b72-Tff7b72>
T8b949e// Enter selection mode and select the item on long press
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3isSelectionModeActiveTb4b4b4) Tb4b4b4{
Te6edf3selectedContactKeysTb4b4b4.Te6edf3addTb4b4b4(Te6edf3contactTb4b4b4.Te6edf3contactKeyTb4b4b4)
Tb4b4b4} Tff7b72else Tb4b4b4{
T8b949e// If already in selection mode, toggle selection
Tff7b72if Tb4b4b4(Te6edf3selectedContactKeysTb4b4b4.Te6edf3containsTb4b4b4(Te6edf3contactTb4b4b4.Te6edf3contactKeyTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3selectedContactKeysTb4b4b4.Te6edf3removeTb4b4b4(Te6edf3contactTb4b4b4.Te6edf3contactKeyTb4b4b4)
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3selectedContactKeysTb4b4b4.Te6edf3addTb4b4b4(Te6edf3contactTb4b4b4.Te6edf3contactKeyTb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Te6edf3ScaffoldTb4b4b4(
Te6edf3topBar Tff7b72= Tb4b4b4{
Te6edf3MainAppBarTb4b4b4(
Te6edf3title Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3conversationsTb4b4b4)Tb4b4b4,
Te6edf3ourNode Tff7b72= Te6edf3ourNodeTb4b4b4,
Te6edf3showNodeChip Tff7b72= Te6edf3ourNode Tff7b72!Tff7b72= Tff7b72null Tff7b72&Tff7b72& Te6edf3connectionStateTb4b4b4.Te6edf3isConnectedTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3canNavigateUp Tff7b72= Tff7b72falseTb4b4b4,
Te6edf3onNavigateUp Tff7b72= Tb4b4b4{Tb4b4b4}Tb4b4b4,
Te6edf3actions Tff7b72= Tb4b4b4{Tb4b4b4}Tb4b4b4,
Te6edf3onClickChip Tff7b72= Tb4b4b4{ Te6edf3onClickNodeChipTb4b4b4(Tffa657itTb4b4b4.Te6edf3numTb4b4b4) Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4}Tb4b4b4,
Te6edf3floatingActionButton Tff7b72= Tb4b4b4{
Te6edf3FloatingActionButtonTb4b4b4(
Te6edf3modifier Tff7b72=
Te6edf3ModifierTb4b4b4.Te6edf3animateFloatingActionButtonTb4b4b4(
Te6edf3visible Tff7b72= Te6edf3connectionStateTb4b4b4.Te6edf3isConnectedTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3alignment Tff7b72= Te6edf3AlignmentTb4b4b4.Te6edf3BottomEndTb4b4b4,
Tb4b4b4)Tb4b4b4,
Te6edf3onClick Tff7b72= Te6edf3onNavigateToShareTb4b4b4,
Tb4b4b4) Tb4b4b4{
Te6edf3IconTb4b4b4(Te6edf3IconsTb4b4b4.Te6edf3RoundedTb4b4b4.Te6edf3QrCode2Tb4b4b4, Te6edf3contentDescription Tff7b72= Tff7b72nullTb4b4b4)
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Tb4b4b4) Tb4b4b4{ Te6edf3paddingValues Tff7b72-Tff7b72>
Te6edf3ColumnTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3paddingTb4b4b4(Te6edf3paddingValuesTb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3isSelectionModeActiveTb4b4b4) Tb4b4b4{
T8b949e// Display selection toolbar when in selection mode
Te6edf3SelectionToolbarTb4b4b4(
Te6edf3selectedCount Tff7b72= Te6edf3selectedContactKeysTb4b4b4.Te6edf3sizeTb4b4b4,
Te6edf3onCloseSelection Tff7b72= Tb4b4b4{ Te6edf3selectedContactKeysTb4b4b4.Te6edf3clearTb4b4b4(Tb4b4b4) Tb4b4b4}Tb4b4b4,
Te6edf3onMuteSelected Tff7b72= Tb4b4b4{ Te6edf3showMuteDialog Tff7b72= Tff7b72true Tb4b4b4}Tb4b4b4,
Te6edf3onDeleteSelected Tff7b72= Tb4b4b4{ Te6edf3showDeleteDialog Tff7b72= Tff7b72true Tb4b4b4}Tb4b4b4,
Te6edf3onSelectAll Tff7b72= Tb4b4b4{
Te6edf3selectedContactKeysTb4b4b4.Te6edf3clearTb4b4b4(Tb4b4b4)
Te6edf3selectedContactKeysTb4b4b4.Te6edf3addAllTb4b4b4(
Tb4b4b4(T79c0ff0 Te6edf3until Te6edf3pagedContactsTb4b4b4.Te6edf3itemCountTb4b4b4)Tb4b4b4.Te6edf3mapNotNull Tb4b4b4{ Te6edf3pagedContactsTff7b72[Tffa657itTff7b72]Tff7b72?.Te6edf3contactKey Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4}Tb4b4b4,
Te6edf3isAllMuted Tff7b72= Te6edf3isAllMutedTb4b4b4, T8b949e// Pass the derived state
Tb4b4b4)
Tb4b4b4}
Te6edf3ContactListViewPagedTb4b4b4(
Te6edf3contacts Tff7b72= Te6edf3pagedContactsTb4b4b4,
Te6edf3channelPlaceholders Tff7b72= Te6edf3channelPlaceholdersTb4b4b4,
Te6edf3selectedList Tff7b72= Te6edf3selectedContactKeysTb4b4b4,
Te6edf3activeContactKey Tff7b72= Te6edf3activeContactKeyTb4b4b4,
Te6edf3onClick Tff7b72= Te6edf3onContactClickTb4b4b4,
Te6edf3onLongClick Tff7b72= Te6edf3onContactLongClickTb4b4b4,
Te6edf3onNodeChipClick Tff7b72= Te6edf3onNodeChipClickTb4b4b4,
Te6edf3listState Tff7b72= Te6edf3contactsListStateTb4b4b4,
Te6edf3channels Tff7b72= Te6edf3channelsTb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Te6edf3DeleteConfirmationDialogTb4b4b4(
Te6edf3showDialog Tff7b72= Te6edf3showDeleteDialogTb4b4b4,
Te6edf3selectedCount Tff7b72= Te6edf3selectedCountTb4b4b4,
Te6edf3onDismiss Tff7b72= Tb4b4b4{ Te6edf3showDeleteDialog Tff7b72= Tff7b72false Tb4b4b4}Tb4b4b4,
Te6edf3onConfirm Tff7b72= Tb4b4b4{
Te6edf3showDeleteDialog Tff7b72= Tff7b72false
Te6edf3viewModelTb4b4b4.Te6edf3deleteContactsTb4b4b4(Te6edf3selectedContactKeysTb4b4b4.Te6edf3toListTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3selectedContactKeysTb4b4b4.Te6edf3clearTb4b4b4(Tb4b4b4)
Tb4b4b4}Tb4b4b4,
Tb4b4b4)
T8b949e// Get contact settings for the dialog
Tff7b72val Te6edf3contactSettings Tff7b72by Te6edf3viewModelTb4b4b4.Te6edf3getContactSettingsTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3collectAsStateWithLifecycleTb4b4b4(Te6edf3initialValue Tff7b72= Te6edf3emptyMapTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3MuteNotificationsDialogTb4b4b4(
Te6edf3showDialog Tff7b72= Te6edf3showMuteDialogTb4b4b4,
Te6edf3selectedContactKeys Tff7b72= Te6edf3selectedContactKeysTb4b4b4.Te6edf3toListTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3contactSettings Tff7b72= Te6edf3contactSettingsTb4b4b4,
Te6edf3onDismiss Tff7b72= Tb4b4b4{ Te6edf3showMuteDialog Tff7b72= Tff7b72false Tb4b4b4}Tb4b4b4,
Te6edf3onConfirm Tff7b72= Tb4b4b4{ Te6edf3muteUntil Tff7b72-Tff7b72>
Te6edf3showMuteDialog Tff7b72= Tff7b72false
Te6edf3viewModelTb4b4b4.Te6edf3setMuteUntilTb4b4b4(Te6edf3selectedContactKeysTb4b4b4.Te6edf3toListTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3muteUntilTb4b4b4)
Te6edf3selectedContactKeysTb4b4b4.Te6edf3clearTb4b4b4(Tb4b4b4)
Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffLongMethodTa5d6ff"Tb4b4b4)
Tf0883e@Composable
Tff7b72private Tff7b72fun Td2a8ffMuteNotificationsDialogTb4b4b4(
Te6edf3showDialogTb4b4b4: Tffa657BooleanTb4b4b4,
Te6edf3selectedContactKeysTb4b4b4: Te6edf3ListTff7b72<Tffa657StringTff7b72>Tb4b4b4,
Te6edf3contactSettingsTb4b4b4: Te6edf3MapTff7b72<Tffa657StringTb4b4b4, Te6edf3ContactSettingsTff7b72>Tb4b4b4,
Te6edf3onDismissTb4b4b4: Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4,
Te6edf3onConfirmTb4b4b4: Tb4b4b4(Tffa657LongTb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4, T8b949e// Lambda to handle the confirmed mute duration
Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3showDialogTb4b4b4) Tb4b4b4{
T8b949e// Options for mute duration
Tff7b72val Te6edf3muteOptions Tff7b72= Te6edf3remember Tb4b4b4{
Te6edf3listOfTb4b4b4(
Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3unmute Te6edf3to T79c0ff0LTb4b4b4,
Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3mute_8_hours Te6edf3to Te6edf3TimeUnitTb4b4b4.Te6edf3HOURSTb4b4b4.Te6edf3toMillisTb4b4b4(T79c0ff8Tb4b4b4)Tb4b4b4,
Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3mute_1_week Te6edf3to Te6edf3TimeUnitTb4b4b4.Te6edf3DAYSTb4b4b4.Te6edf3toMillisTb4b4b4(T79c0ff7Tb4b4b4)Tb4b4b4,
Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3mute_always Te6edf3to Tffa657LongTb4b4b4.Te6edf3MAX_VALUETb4b4b4,
Tb4b4b4)
Tb4b4b4}
T8b949e// State to hold the selected mute duration index
Tff7b72var Te6edf3selectedOptionIndex Tff7b72by Te6edf3remember Tb4b4b4{ Te6edf3mutableStateOfTb4b4b4(T79c0ff2Tb4b4b4) Tb4b4b4} T8b949e// Default to "Always"
Te6edf3AlertDialogTb4b4b4(
Te6edf3onDismissRequest Tff7b72= Te6edf3onDismissTb4b4b4, T8b949e// Dismiss the dialog when clicked outside
Te6edf3title Tff7b72= Tb4b4b4{ Te6edf3TextTb4b4b4(Te6edf3text Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3mute_notificationsTb4b4b4)Tb4b4b4) Tb4b4b4}Tb4b4b4,
Te6edf3text Tff7b72= Tb4b4b4{
Te6edf3Column Tb4b4b4{
T8b949e// Show current mute status
Te6edf3selectedContactKeysTb4b4b4.Te6edf3forEach Tb4b4b4{ Te6edf3contactKey Tff7b72-Tff7b72>
Te6edf3contactSettingsTff7b72[Te6edf3contactKeyTff7b72]Tff7b72?.Te6edf3let Tb4b4b4{ Te6edf3settings Tff7b72-Tff7b72>
Tff7b72val Te6edf3now Tff7b72= Te6edf3SystemTb4b4b4.Te6edf3currentTimeMillisTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3statusText Tff7b72=
Tff7b72when Tb4b4b4{
Te6edf3settingsTb4b4b4.Te6edf3muteUntil Tff7b72> T79c0ff0 Tff7b72&Tff7b72& Te6edf3settingsTb4b4b4.Te6edf3muteUntil Tff7b72!Tff7b72= Tffa657LongTb4b4b4.Te6edf3MAX_VALUE Tff7b72-Tff7b72> Tb4b4b4{
Tff7b72val Te6edf3remaining Tff7b72= Te6edf3settingsTb4b4b4.Te6edf3muteUntil Tff7b72- Te6edf3now
Tff7b72if Tb4b4b4(Te6edf3remaining Tff7b72> T79c0ff0Tb4b4b4) Tb4b4b4{
Tff7b72val Tb4b4b4(Te6edf3daysTb4b4b4, Te6edf3hoursTb4b4b4) Tff7b72= Te6edf3formatMuteRemainingTimeTb4b4b4(Te6edf3remainingTb4b4b4)
Tff7b72if Tb4b4b4(Te6edf3days Tff7b72>Tff7b72= T79c0ff1Tb4b4b4) Tb4b4b4{
Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3mute_status_muted_for_daysTb4b4b4, Te6edf3daysTb4b4b4, Te6edf3hoursTb4b4b4)
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3mute_status_muted_for_hoursTb4b4b4, Te6edf3hoursTb4b4b4)
Tb4b4b4}
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3mute_status_unmutedTb4b4b4)
Tb4b4b4}
Tb4b4b4}
Te6edf3settingsTb4b4b4.Te6edf3muteUntil Tff7b72=Tff7b72= Tffa657LongTb4b4b4.Te6edf3MAX_VALUE Tff7b72-Tff7b72>
Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3mute_status_alwaysTb4b4b4)
Tff7b72else Tff7b72-Tff7b72> Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3mute_status_unmutedTb4b4b4)
Tb4b4b4}
Te6edf3TextTb4b4b4(
Te6edf3text Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3currentlyTb4b4b4) Tff7b72+ Ta5d6ff"Ta5d6ff Ta5d6ff" Tff7b72+ Te6edf3statusTextTb4b4b4,
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3paddingTb4b4b4(Te6edf3bottom Tff7b72= T79c0ff8.Te6edf3dpTb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Te6edf3muteOptionsTb4b4b4.Te6edf3forEachIndexed Tb4b4b4{ Te6edf3indexTb4b4b4, Tb4b4b4(Te6edf3stringResTb4b4b4, Te6edf3_Tb4b4b4) Tff7b72-Tff7b72>
Tff7b72val Te6edf3isSelected Tff7b72= Te6edf3index Tff7b72=Tff7b72= Te6edf3selectedOptionIndex
Tff7b72val Te6edf3text Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3stringResTb4b4b4)
Te6edf3RowTb4b4b4(
Te6edf3modifier Tff7b72=
Te6edf3ModifierTb4b4b4.Te6edf3fillMaxWidthTb4b4b4(Tb4b4b4)
Tb4b4b4.Te6edf3selectableTb4b4b4(Te6edf3selected Tff7b72= Te6edf3isSelectedTb4b4b4, Te6edf3onClick Tff7b72= Tb4b4b4{ Te6edf3selectedOptionIndex Tff7b72= Te6edf3index Tb4b4b4}Tb4b4b4)
Tb4b4b4.Te6edf3paddingTb4b4b4(Te6edf3vertical Tff7b72= T79c0ff8.Te6edf3dpTb4b4b4)Tb4b4b4,
Te6edf3verticalAlignment Tff7b72= Te6edf3AlignmentTb4b4b4.Te6edf3CenterVerticallyTb4b4b4,
Tb4b4b4) Tb4b4b4{
Te6edf3RadioButtonTb4b4b4(Te6edf3selected Tff7b72= Te6edf3isSelectedTb4b4b4, Te6edf3onClick Tff7b72= Tb4b4b4{ Te6edf3selectedOptionIndex Tff7b72= Te6edf3index Tb4b4b4}Tb4b4b4)
Te6edf3TextTb4b4b4(Te6edf3text Tff7b72= Te6edf3textTb4b4b4, Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3paddingTb4b4b4(Te6edf3start Tff7b72= T79c0ff8.Te6edf3dpTb4b4b4)Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Te6edf3confirmButton Tff7b72= Tb4b4b4{
Te6edf3ButtonTb4b4b4(
Te6edf3onClick Tff7b72= Tb4b4b4{
Tff7b72val Te6edf3selectedMuteDuration Tff7b72= Te6edf3muteOptionsTff7b72[Te6edf3selectedOptionIndexTff7b72]Tb4b4b4.Te6edf3second
Te6edf3onConfirmTb4b4b4(Te6edf3selectedMuteDurationTb4b4b4)
Te6edf3onDismissTb4b4b4(Tb4b4b4) T8b949e// Dismiss the dialog after confirming
Tb4b4b4}Tb4b4b4,
Tb4b4b4) Tb4b4b4{
Te6edf3TextTb4b4b4(Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3okayTb4b4b4)Tb4b4b4)
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Te6edf3dismissButton Tff7b72= Tb4b4b4{
Te6edf3ButtonTb4b4b4(
Te6edf3onClick Tff7b72= Te6edf3onDismissTb4b4b4, T8b949e// Dismiss the dialog on cancel
Tb4b4b4) Tb4b4b4{
Te6edf3TextTb4b4b4(Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3cancelTb4b4b4)Tb4b4b4)
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tf0883e@Composable
Tff7b72private Tff7b72fun Td2a8ffDeleteConfirmationDialogTb4b4b4(
Te6edf3showDialogTb4b4b4: Tffa657BooleanTb4b4b4,
Te6edf3selectedCountTb4b4b4: Tffa657IntTb4b4b4, T8b949e// Number of items to be deleted
Te6edf3onDismissTb4b4b4: Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4,
Te6edf3onConfirmTb4b4b4: Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4, T8b949e// Lambda to handle the delete action
Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3showDialogTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3deleteMessage Tff7b72=
Te6edf3pluralStringResourceTb4b4b4(
Te6edf3ResTb4b4b4.Te6edf3pluralsTb4b4b4.Te6edf3delete_messagesTb4b4b4,
Te6edf3selectedCountTb4b4b4,
Te6edf3arrayOfTb4b4b4(Te6edf3selectedCountTb4b4b4)Tb4b4b4, T8b949e// Pass the count as a format argument
Tb4b4b4)
Te6edf3AlertDialogTb4b4b4(
Te6edf3onDismissRequest Tff7b72= Te6edf3onDismissTb4b4b4,
Te6edf3title Tff7b72= Tb4b4b4{
T8b949e// Optional: You could add a title here if needed, e.g., "Confirm Deletion"
Tb4b4b4}Tb4b4b4,
Te6edf3text Tff7b72= Tb4b4b4{ Te6edf3TextTb4b4b4(Te6edf3text Tff7b72= Te6edf3deleteMessageTb4b4b4) Tb4b4b4}Tb4b4b4,
Te6edf3confirmButton Tff7b72= Tb4b4b4{
Te6edf3ButtonTb4b4b4(
Te6edf3onClick Tff7b72= Tb4b4b4{
Te6edf3onConfirmTb4b4b4(Tb4b4b4)
Te6edf3onDismissTb4b4b4(Tb4b4b4) T8b949e// Dismiss the dialog after confirming
Tb4b4b4}Tb4b4b4,
Tb4b4b4) Tb4b4b4{
Te6edf3TextTb4b4b4(Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3deleteTb4b4b4)Tb4b4b4)
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Te6edf3dismissButton Tff7b72= Tb4b4b4{ Te6edf3ButtonTb4b4b4(Te6edf3onClick Tff7b72= Te6edf3onDismissTb4b4b4) Tb4b4b4{ Te6edf3TextTb4b4b4(Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3cancelTb4b4b4)Tb4b4b4) Tb4b4b4} Tb4b4b4}Tb4b4b4,
Te6edf3properties Tff7b72=
Te6edf3DialogPropertiesTb4b4b4(
Te6edf3dismissOnClickOutside Tff7b72= Tff7b72trueTb4b4b4, T8b949e// Allow dismissing by clicking outside
Te6edf3dismissOnBackPress Tff7b72= Tff7b72trueTb4b4b4, T8b949e// Allow dismissing with the back button
Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tf0883e@OptInTb4b4b4(Te6edf3ExperimentalMaterial3ApiTff7b72::Te6edf3classTb4b4b4)
Tf0883e@Composable
Tff7b72private Tff7b72fun Td2a8ffSelectionToolbarTb4b4b4(
Te6edf3selectedCountTb4b4b4: Tffa657IntTb4b4b4,
Te6edf3onCloseSelectionTb4b4b4: Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4,
Te6edf3onMuteSelectedTb4b4b4: Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4,
Te6edf3onDeleteSelectedTb4b4b4: Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4,
Te6edf3onSelectAllTb4b4b4: Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4,
Te6edf3isAllMutedTb4b4b4: Tffa657BooleanTb4b4b4,
Tb4b4b4) Tb4b4b4{
Te6edf3TopAppBarTb4b4b4(
Te6edf3title Tff7b72= Tb4b4b4{ Te6edf3TextTb4b4b4(Te6edf3text Tff7b72= Ta5d6ff"Tffd700$Te6edf3selectedCountTa5d6ff"Tb4b4b4) Tb4b4b4}Tb4b4b4,
Te6edf3navigationIcon Tff7b72= Tb4b4b4{
Te6edf3IconButtonTb4b4b4(Te6edf3onClick Tff7b72= Te6edf3onCloseSelectionTb4b4b4) Tb4b4b4{
Te6edf3IconTb4b4b4(Te6edf3IconsTb4b4b4.Te6edf3DefaultTb4b4b4.Te6edf3CloseTb4b4b4, Te6edf3contentDescription Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3close_selectionTb4b4b4)Tb4b4b4)
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Te6edf3actions Tff7b72= Tb4b4b4{
Te6edf3IconButtonTb4b4b4(Te6edf3onClick Tff7b72= Te6edf3onMuteSelectedTb4b4b4) Tb4b4b4{
Te6edf3IconTb4b4b4(
Te6edf3imageVector Tff7b72=
Tff7b72if Tb4b4b4(Te6edf3isAllMutedTb4b4b4) Tb4b4b4{
Te6edf3IconsTb4b4b4.Te6edf3AutoMirroredTb4b4b4.Te6edf3TwoToneTb4b4b4.Te6edf3VolumeUp
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3IconsTb4b4b4.Te6edf3AutoMirroredTb4b4b4.Te6edf3TwoToneTb4b4b4.Te6edf3VolumeMute
Tb4b4b4}Tb4b4b4,
Te6edf3contentDescription Tff7b72=
Tff7b72if Tb4b4b4(Te6edf3isAllMutedTb4b4b4) Tb4b4b4{
Ta5d6ff"Ta5d6ffUnmute selectedTa5d6ff"
Tb4b4b4} Tff7b72else Tb4b4b4{
Ta5d6ff"Ta5d6ffMute selectedTa5d6ff"
Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Te6edf3IconButtonTb4b4b4(Te6edf3onClick Tff7b72= Te6edf3onDeleteSelectedTb4b4b4) Tb4b4b4{
Te6edf3IconTb4b4b4(Te6edf3IconsTb4b4b4.Te6edf3DefaultTb4b4b4.Te6edf3DeleteTb4b4b4, Te6edf3contentDescription Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3delete_selectionTb4b4b4)Tb4b4b4)
Tb4b4b4}
Te6edf3IconButtonTb4b4b4(Te6edf3onClick Tff7b72= Te6edf3onSelectAllTb4b4b4) Tb4b4b4{
Te6edf3IconTb4b4b4(Te6edf3IconsTb4b4b4.Te6edf3DefaultTb4b4b4.Te6edf3SelectAllTb4b4b4, Te6edf3contentDescription Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3select_allTb4b4b4)Tb4b4b4)
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tf0883e@Composable
Tff7b72private Tff7b72fun Td2a8ffContactListViewPagedTb4b4b4(
Te6edf3contactsTb4b4b4: Te6edf3LazyPagingItemsTff7b72<Te6edf3ContactTff7b72>Tb4b4b4,
Te6edf3channelPlaceholdersTb4b4b4: Te6edf3ListTff7b72<Te6edf3ContactTff7b72>Tb4b4b4,
Te6edf3selectedListTb4b4b4: Te6edf3ListTff7b72<Tffa657StringTff7b72>Tb4b4b4,
Te6edf3activeContactKeyTb4b4b4: Tffa657String?Tb4b4b4,
Te6edf3onClickTb4b4b4: Tb4b4b4(Te6edf3ContactTb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4,
Te6edf3onLongClickTb4b4b4: Tb4b4b4(Te6edf3ContactTb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4,
Te6edf3onNodeChipClickTb4b4b4: Tb4b4b4(Te6edf3ContactTb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4,
Te6edf3listStateTb4b4b4: Te6edf3LazyListStateTb4b4b4,
Te6edf3modifierTb4b4b4: Te6edf3Modifier Tff7b72= Te6edf3ModifierTb4b4b4,
Te6edf3channelsTb4b4b4: Te6edf3AppOnlyProtosTb4b4b4.Te6edf3ChannelSetTff7b72? Tff7b72= Tff7b72nullTb4b4b4,
Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3haptics Tff7b72= Te6edf3LocalHapticFeedbackTb4b4b4.Te6edf3current
Tff7b72if Tb4b4b4(Te6edf3contactsTb4b4b4.Te6edf3loadStateTb4b4b4.Te6edf3refresh Tff7b72is Te6edf3LoadStateTb4b4b4.Te6edf3Loading Tff7b72&Tff7b72& Te6edf3contactsTb4b4b4.Te6edf3itemCount Tff7b72=Tff7b72= T79c0ff0Tb4b4b4) Tb4b4b4{
Te6edf3BoxTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3modifierTb4b4b4.Te6edf3fillMaxSizeTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3contentAlignment Tff7b72= Te6edf3AlignmentTb4b4b4.Te6edf3CenterTb4b4b4) Tb4b4b4{ Te6edf3CircularProgressIndicatorTb4b4b4(Tb4b4b4) Tb4b4b4}
Tff7b72return
Tb4b4b4}
Tff7b72val Te6edf3visiblePlaceholders Tff7b72= Te6edf3rememberVisiblePlaceholdersTb4b4b4(Te6edf3contactsTb4b4b4, Te6edf3channelPlaceholdersTb4b4b4)
Te6edf3ContactListContentInternalTb4b4b4(
Te6edf3contacts Tff7b72= Te6edf3contactsTb4b4b4,
Te6edf3visiblePlaceholders Tff7b72= Te6edf3visiblePlaceholdersTb4b4b4,
Te6edf3selectedList Tff7b72= Te6edf3selectedListTb4b4b4,
Te6edf3activeContactKey Tff7b72= Te6edf3activeContactKeyTb4b4b4,
Te6edf3onClick Tff7b72= Te6edf3onClickTb4b4b4,
Te6edf3onLongClick Tff7b72= Te6edf3onLongClickTb4b4b4,
Te6edf3onNodeChipClick Tff7b72= Te6edf3onNodeChipClickTb4b4b4,
Te6edf3listState Tff7b72= Te6edf3listStateTb4b4b4,
Te6edf3modifier Tff7b72= Te6edf3modifierTb4b4b4,
Te6edf3channels Tff7b72= Te6edf3channelsTb4b4b4,
Te6edf3haptics Tff7b72= Te6edf3hapticsTb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tf0883e@Composable
Tff7b72private Tff7b72fun Td2a8ffContactListContentInternalTb4b4b4(
Te6edf3contactsTb4b4b4: Te6edf3LazyPagingItemsTff7b72<Te6edf3ContactTff7b72>Tb4b4b4,
Te6edf3visiblePlaceholdersTb4b4b4: Te6edf3ListTff7b72<Te6edf3ContactTff7b72>Tb4b4b4,
Te6edf3selectedListTb4b4b4: Te6edf3ListTff7b72<Tffa657StringTff7b72>Tb4b4b4,
Te6edf3activeContactKeyTb4b4b4: Tffa657String?Tb4b4b4,
Te6edf3onClickTb4b4b4: Tb4b4b4(Te6edf3ContactTb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4,
Te6edf3onLongClickTb4b4b4: Tb4b4b4(Te6edf3ContactTb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4,
Te6edf3onNodeChipClickTb4b4b4: Tb4b4b4(Te6edf3ContactTb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4,
Te6edf3listStateTb4b4b4: Te6edf3LazyListStateTb4b4b4,
Te6edf3channelsTb4b4b4: Te6edf3AppOnlyProtosTb4b4b4.Te6edf3ChannelSetTff7b72?Tb4b4b4,
Te6edf3hapticsTb4b4b4: Te6edf3HapticFeedbackTb4b4b4,
Te6edf3modifierTb4b4b4: Te6edf3Modifier Tff7b72= Te6edf3ModifierTb4b4b4,
Tb4b4b4) Tb4b4b4{
Te6edf3LazyColumnTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3modifierTb4b4b4.Te6edf3fillMaxSizeTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3state Tff7b72= Te6edf3listStateTb4b4b4) Tb4b4b4{
Te6edf3contactListPlaceholdersItemsTb4b4b4(
Te6edf3visiblePlaceholders Tff7b72= Te6edf3visiblePlaceholdersTb4b4b4,
Te6edf3selectedList Tff7b72= Te6edf3selectedListTb4b4b4,
Te6edf3activeContactKey Tff7b72= Te6edf3activeContactKeyTb4b4b4,
Te6edf3onClick Tff7b72= Te6edf3onClickTb4b4b4,
Te6edf3onLongClick Tff7b72= Te6edf3onLongClickTb4b4b4,
Te6edf3onNodeChipClick Tff7b72= Te6edf3onNodeChipClickTb4b4b4,
Te6edf3channels Tff7b72= Te6edf3channelsTb4b4b4,
Te6edf3haptics Tff7b72= Te6edf3hapticsTb4b4b4,
Tb4b4b4)
Te6edf3contactListPagedItemsTb4b4b4(
Te6edf3contacts Tff7b72= Te6edf3contactsTb4b4b4,
Te6edf3selectedList Tff7b72= Te6edf3selectedListTb4b4b4,
Te6edf3activeContactKey Tff7b72= Te6edf3activeContactKeyTb4b4b4,
Te6edf3onClick Tff7b72= Te6edf3onClickTb4b4b4,
Te6edf3onLongClick Tff7b72= Te6edf3onLongClickTb4b4b4,
Te6edf3onNodeChipClick Tff7b72= Te6edf3onNodeChipClickTb4b4b4,
Te6edf3channels Tff7b72= Te6edf3channelsTb4b4b4,
Te6edf3haptics Tff7b72= Te6edf3hapticsTb4b4b4,
Tb4b4b4)
Te6edf3contactListAppendLoadingItemTb4b4b4(Te6edf3contacts Tff7b72= Te6edf3contactsTb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tff7b72private Tff7b72fun Te6edf3LazyListScopeTb4b4b4.Td2a8ffcontactListPlaceholdersItemsTb4b4b4(
Te6edf3visiblePlaceholdersTb4b4b4: Te6edf3ListTff7b72<Te6edf3ContactTff7b72>Tb4b4b4,
Te6edf3selectedListTb4b4b4: Te6edf3ListTff7b72<Tffa657StringTff7b72>Tb4b4b4,
Te6edf3activeContactKeyTb4b4b4: Tffa657String?Tb4b4b4,
Te6edf3onClickTb4b4b4: Tb4b4b4(Te6edf3ContactTb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4,
Te6edf3onLongClickTb4b4b4: Tb4b4b4(Te6edf3ContactTb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4,
Te6edf3onNodeChipClickTb4b4b4: Tb4b4b4(Te6edf3ContactTb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4,
Te6edf3channelsTb4b4b4: Te6edf3AppOnlyProtosTb4b4b4.Te6edf3ChannelSetTff7b72?Tb4b4b4,
Te6edf3hapticsTb4b4b4: Te6edf3HapticFeedbackTb4b4b4,
Tb4b4b4) Tb4b4b4{
Te6edf3itemsTb4b4b4(
Te6edf3count Tff7b72= Te6edf3visiblePlaceholdersTb4b4b4.Te6edf3sizeTb4b4b4,
Te6edf3key Tff7b72= Tb4b4b4{ Te6edf3index Tff7b72-Tff7b72> Ta5d6ff"Ta5d6ffplaceholder_Tffd700${Te6edf3visiblePlaceholdersTff7b72[Te6edf3indexTff7b72]Tb4b4b4.Te6edf3contactKeyTffd700}Ta5d6ff" Tb4b4b4}Tb4b4b4,
Tb4b4b4) Tb4b4b4{ Te6edf3index Tff7b72-Tff7b72>
Tff7b72val Te6edf3placeholder Tff7b72= Te6edf3visiblePlaceholdersTff7b72[Te6edf3indexTff7b72]
Tff7b72val Te6edf3selected Tff7b72by Te6edf3remember Tb4b4b4{ Te6edf3derivedStateOf Tb4b4b4{ Te6edf3selectedListTb4b4b4.Te6edf3containsTb4b4b4(Te6edf3placeholderTb4b4b4.Te6edf3contactKeyTb4b4b4) Tb4b4b4} Tb4b4b4}
Tff7b72val Te6edf3isActive Tff7b72= Te6edf3rememberTb4b4b4(Te6edf3placeholderTb4b4b4.Te6edf3contactKeyTb4b4b4, Te6edf3activeContactKeyTb4b4b4) Tb4b4b4{ Te6edf3placeholderTb4b4b4.Te6edf3contactKey Tff7b72=Tff7b72= Te6edf3activeContactKey Tb4b4b4}
Te6edf3ContactItemTb4b4b4(
Te6edf3contact Tff7b72= Te6edf3placeholderTb4b4b4,
Te6edf3selected Tff7b72= Te6edf3selectedTb4b4b4,
Te6edf3isActive Tff7b72= Te6edf3isActiveTb4b4b4,
Te6edf3onClick Tff7b72= Tb4b4b4{ Te6edf3onClickTb4b4b4(Te6edf3placeholderTb4b4b4) Tb4b4b4}Tb4b4b4,
Te6edf3onLongClick Tff7b72= Tb4b4b4{
Te6edf3onLongClickTb4b4b4(Te6edf3placeholderTb4b4b4)
Te6edf3hapticsTb4b4b4.Te6edf3performHapticFeedbackTb4b4b4(Te6edf3HapticFeedbackTypeTb4b4b4.Te6edf3LongPressTb4b4b4)
Tb4b4b4}Tb4b4b4,
Te6edf3channels Tff7b72= Te6edf3channelsTb4b4b4,
Te6edf3onNodeChipClick Tff7b72= Tb4b4b4{ Te6edf3onNodeChipClickTb4b4b4(Te6edf3placeholderTb4b4b4) Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tff7b72private Tff7b72fun Te6edf3LazyListScopeTb4b4b4.Td2a8ffcontactListPagedItemsTb4b4b4(
Te6edf3contactsTb4b4b4: Te6edf3LazyPagingItemsTff7b72<Te6edf3ContactTff7b72>Tb4b4b4,
Te6edf3selectedListTb4b4b4: Te6edf3ListTff7b72<Tffa657StringTff7b72>Tb4b4b4,
Te6edf3activeContactKeyTb4b4b4: Tffa657String?Tb4b4b4,
Te6edf3onClickTb4b4b4: Tb4b4b4(Te6edf3ContactTb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4,
Te6edf3onLongClickTb4b4b4: Tb4b4b4(Te6edf3ContactTb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4,
Te6edf3onNodeChipClickTb4b4b4: Tb4b4b4(Te6edf3ContactTb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4,
Te6edf3channelsTb4b4b4: Te6edf3AppOnlyProtosTb4b4b4.Te6edf3ChannelSetTff7b72?Tb4b4b4,
Te6edf3hapticsTb4b4b4: Te6edf3HapticFeedbackTb4b4b4,
Tb4b4b4) Tb4b4b4{
Te6edf3itemsTb4b4b4(
Te6edf3count Tff7b72= Te6edf3contactsTb4b4b4.Te6edf3itemCountTb4b4b4,
Te6edf3key Tff7b72= Tb4b4b4{ Te6edf3index Tff7b72-Tff7b72>
Tff7b72val Te6edf3contact Tff7b72= Te6edf3contactsTff7b72[Te6edf3indexTff7b72]
Te6edf3contactTff7b72?.Te6edf3let Tb4b4b4{ Ta5d6ff"Tffd700${Tffa657itTb4b4b4.Te6edf3contactKeyTffd700}Ta5d6ff#Tffd700$Te6edf3indexTa5d6ff" Tb4b4b4} Tff7b72?: Ta5d6ff"Ta5d6ffcontact_placeholder_Tffd700$Te6edf3indexTa5d6ff"
Tb4b4b4}Tb4b4b4,
Tb4b4b4) Tb4b4b4{ Te6edf3index Tff7b72-Tff7b72>
Tff7b72val Te6edf3contact Tff7b72= Te6edf3contactsTff7b72[Te6edf3indexTff7b72]
Tff7b72if Tb4b4b4(Te6edf3contact Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3selected Tff7b72by Te6edf3remember Tb4b4b4{ Te6edf3derivedStateOf Tb4b4b4{ Te6edf3selectedListTb4b4b4.Te6edf3containsTb4b4b4(Te6edf3contactTb4b4b4.Te6edf3contactKeyTb4b4b4) Tb4b4b4} Tb4b4b4}
Tff7b72val Te6edf3isActive Tff7b72= Te6edf3rememberTb4b4b4(Te6edf3contactTb4b4b4.Te6edf3contactKeyTb4b4b4, Te6edf3activeContactKeyTb4b4b4) Tb4b4b4{ Te6edf3contactTb4b4b4.Te6edf3contactKey Tff7b72=Tff7b72= Te6edf3activeContactKey Tb4b4b4}
Te6edf3ContactItemTb4b4b4(
Te6edf3contact Tff7b72= Te6edf3contactTb4b4b4,
Te6edf3selected Tff7b72= Te6edf3selectedTb4b4b4,
Te6edf3isActive Tff7b72= Te6edf3isActiveTb4b4b4,
Te6edf3onClick Tff7b72= Tb4b4b4{ Te6edf3onClickTb4b4b4(Te6edf3contactTb4b4b4) Tb4b4b4}Tb4b4b4,
Te6edf3onLongClick Tff7b72= Tb4b4b4{
Te6edf3onLongClickTb4b4b4(Te6edf3contactTb4b4b4)
Te6edf3hapticsTb4b4b4.Te6edf3performHapticFeedbackTb4b4b4(Te6edf3HapticFeedbackTypeTb4b4b4.Te6edf3LongPressTb4b4b4)
Tb4b4b4}Tb4b4b4,
Te6edf3channels Tff7b72= Te6edf3channelsTb4b4b4,
Te6edf3onNodeChipClick Tff7b72= Tb4b4b4{ Te6edf3onNodeChipClickTb4b4b4(Te6edf3contactTb4b4b4) Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tff7b72private Tff7b72fun Te6edf3LazyListScopeTb4b4b4.Td2a8ffcontactListAppendLoadingItemTb4b4b4(Te6edf3contactsTb4b4b4: Te6edf3LazyPagingItemsTff7b72<Te6edf3ContactTff7b72>Tb4b4b4) Tb4b4b4{
Te6edf3contactsTb4b4b4.Te6edf3apply Tb4b4b4{
Tff7b72when Tb4b4b4{
Te6edf3loadStateTb4b4b4.Te6edf3append Tff7b72is Te6edf3LoadStateTb4b4b4.Te6edf3Loading Tff7b72-Tff7b72> Tb4b4b4{
Te6edf3itemTb4b4b4(Te6edf3key Tff7b72= Ta5d6ff"Ta5d6ffappend_loadingTa5d6ff"Tb4b4b4) Tb4b4b4{
Te6edf3BoxTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3fillMaxWidthTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3paddingTb4b4b4(T79c0ff1T79c0ff6.Te6edf3dpTb4b4b4)Tb4b4b4, Te6edf3contentAlignment Tff7b72= Te6edf3AlignmentTb4b4b4.Te6edf3CenterTb4b4b4) Tb4b4b4{
Te6edf3CircularProgressIndicatorTb4b4b4(Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tf0883e@Composable
Tff7b72private Tff7b72fun Td2a8ffrememberVisiblePlaceholdersTb4b4b4(
Te6edf3contactsTb4b4b4: Te6edf3LazyPagingItemsTff7b72<Te6edf3ContactTff7b72>Tb4b4b4,
Te6edf3channelPlaceholdersTb4b4b4: Te6edf3ListTff7b72<Te6edf3ContactTff7b72>Tb4b4b4,
Tb4b4b4)Tb4b4b4: Te6edf3ListTff7b72<Te6edf3ContactTff7b72> Tb4b4b4{
Tff7b72val Te6edf3contactKeys Tff7b72by
Te6edf3rememberTb4b4b4(Te6edf3contactsTb4b4b4.Te6edf3itemCountTb4b4b4) Tb4b4b4{
Te6edf3derivedStateOf Tb4b4b4{ Tb4b4b4(T79c0ff0 Te6edf3until Te6edf3contactsTb4b4b4.Te6edf3itemCountTb4b4b4)Tb4b4b4.Te6edf3mapNotNull Tb4b4b4{ Te6edf3contactsTff7b72[Tffa657itTff7b72]Tff7b72?.Te6edf3contactKey Tb4b4b4}Tb4b4b4.Te6edf3toSetTb4b4b4(Tb4b4b4) Tb4b4b4}
Tb4b4b4}
Tff7b72return Te6edf3rememberTb4b4b4(Te6edf3channelPlaceholdersTb4b4b4, Te6edf3contactKeysTb4b4b4) Tb4b4b4{
Te6edf3channelPlaceholdersTb4b4b4.Te6edf3filter Tb4b4b4{ Te6edf3placeholder Tff7b72-Tff7b72> Tff7b72!Te6edf3contactKeysTb4b4b4.Te6edf3containsTb4b4b4(Te6edf3placeholderTb4b4b4.Te6edf3contactKeyTb4b4b4) Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Served by rngit 1.5.0 - Generated in 0.16s